<?php
/**
 * Created by PhpStorm.
 * User: wodrow
 * Date: 18-2-28
 * Time: 下午4:13
 */

namespace api\modules\proxy_payment\controllers;


use common\components\proxy_payment\Config;
use common\components\proxy_payment\Fuiou;
use common\components\proxy_payment\ProxyPayment;
use common\components\tools\Tools;
use common\models\ProxyPay;
use common\models\ProxyPayBack;
use wodrow\yii\rest\Controller;
use yii\base\ErrorException;
use yii\db\Exception;

class BusinessController extends Controller
{
    /**
     * 付款
     * @desc get/post
     * @param string $companyCode 公司识别码
     * @param string $unique_id 客户端给的判断唯一序列号
     * @param string $branchnm 支行名称
     * @param string $accntno 卡号
     * @param string $accntnm 姓名
     * @param float $amount 总金额/分
     * @param string $other_data 其他信息serialize
     * @throws ErrorException
     * @throws Exception
     * @return array
     */
    public function actionPay($companyCode, $unique_id, $branchnm, $accntno, $accntnm, $amount, $other_data = null)
    {
        /*$other_data = serialize([
            'bankno' => '0104',
            'cityno' => '1000',
        ]);
        echo $other_data;exit;*/
        if (ProxyPay::findOne(['unique_id'=>$unique_id, 'status' => ProxyPay::STATUS_OK])){
            throw new ErrorException("已成功，不能重复提交代付");
        }
        $plat_form = ProxyPayment::getPlatForm($companyCode);
        $plat_form->pay_model = new ProxyPay();
        $plat_form->pay_model->company_code = $companyCode;
        $plat_form->pay_model->unique_id = $unique_id;
        $plat_form->pay_model->branchnm = $branchnm;
        $plat_form->pay_model->accntno = $accntno;
        $plat_form->pay_model->accntnm = $accntnm;
        $plat_form->pay_model->amount = $amount;
        $plat_form->pay_model->created_at = time();
        $plat_form->pay_model->other_data = $other_data;
        $plat_form->pay();
        $r = $plat_form->getReturn();
        /*if (isset($r['_bakc']['ret_code'])&&$r['_bakc']['ret_code']=='000000'){
            $plat_form->pay_model->status = ProxyPay::STATUS_OK;
        }else{
            $plat_form->pay_model->status = ProxyPay::STATUS_FAILED;
        }*/
        if ($plat_form->pay_model->save()){
            $r['pay_model'] = $plat_form->pay_model->toArray();
            return $r;
        }else{
            throw new ErrorException('保存proxy_pay失败'.var_export($plat_form->pay_model->errors, true));
        }
    }

    /**
     * 富友退票通知
     * @desc post 系统对账完成后，收付平台生产退票，系统主动通知商户。 此通知接口为回调接口，需要商户提供回调地址。 退票通知生成区间，从交易发送到银行至 T+1，期间如有退票，会 3min 内生成通知。 生成通知后会调用商户提供回调地址进行通知，如果通知失败，会间隔 1min 再次通知，
    一共通知 5 次，如果 5 次回调通知都失败，将不再发送。 mac 为校验值，商户用以确认交易数据的准确性。
     * @param string $orderno 商户请求流水/如果商户没传则为空字符串
     * @param string $merdt 原请求日期/原交易日期
     * @param string $fuorderno 富友流水/富友生成的原交易流水
     * @param string $tpmerdt 退票日期/退票生成日期
     * @param string $futporderno 退票流水/退票当日唯一流水
     * @param string $accntno 账号/银行卡号
     * @param string $accntnm 账户名称/银行卡持卡人姓名
     * @param string $bankno 总行代码/参见总行代码表
     * @param integer $amt 退票金额/单位：分
     * @param string $state 状态/参见交易状态码说明，1 为退票成功
     * @param string $result 交易结果
     * @param string $reason 结果原因
     * @param string $mac 校验值[商户号|富友分配给商户的密钥|商户请求流水|原请求日期|账号|退票金额，用竖线拼接后用 MD5 散列后的16 进制文本: Md5(merid+"|"+pwd+"|"+orderno+"|"+merdt+"|"+accntno+"|"+amt)]
     * @throws ErrorException
     * @throws Exception
     * @return array
     */
    public function actionFuiouNoticeOfDishonour($orderno, $merdt, $fuorderno, $tpmerdt, $futporderno, $accntno, $accntnm, $bankno, $amt, $state, $result, $reason = null, $mac)
    {
        $o = [];
        $x = Md5(Config::$fuiou['login_account']."|".Config::$fuiou['dock_key']."|".$orderno."|".$merdt."|".$accntno."|".$amt);
        if ($x!=$mac){
            throw new ErrorException("校验值错误!你的校验值是[{$mac}],本接口计算得到的[{$x}]");
        }
        $pay = ProxyPay::findOne(['orderno' => $orderno]);
        if (!$pay){
            throw new ErrorException('没有找到代付订单');
        }
        $plat = new Fuiou();
        $pay_back = new ProxyPayBack();
        $pay_back->proxy_pay_id = $pay->id;
        $pay_back->created_at = time();
        $pay_back->state = $state;
        $pay_back->result = $result;
        $pay_back->reason = $reason;
        $pay_back->original_created_at = $merdt;
        $pay_back->back_time = $tpmerdt;
        $pay_back->fuiou_order_no = $fuorderno;
        $pay_back->back_order_no = $futporderno;
        $pay_back->accnt_no = $accntno;
        $pay_back->accnt_nm = $accntnm;
        $pay_back->amount = $amt;
        $pay_back->bank_no = $bankno;
        $pay->status = $plat::stateAndStatusMap()[$state];
        $plat->pay_model = $pay;
        $plat->pay_back_model = $pay_back;
        $trans = \Yii::$app->db->beginTransaction();
        try{
            $plat->pay_model->save(false);
            $plat->pay_back_model->save(false);
            $trans->commit();
        }catch (Exception $e){
            $trans->rollBack();
            throw $e;
        }
        $o['pay'] = $plat->pay_model->toArray();
        $o['pay_back'] = $plat->pay_back_model->toArray();
        return $o;
    }

    /**
     * 生成PDF电子回单文档
     */
    public function actionCreatePdfDocu()
    {
        $plat = new Fuiou();
    }

    /**
     * 富友 1. 开户注册
     * @return array
     * @throws
     */
    public function actionFuiouSignUp($name, $cert_id, $mobile, $card_no)
    {
        $plat = new Fuiou();
        $r = $plat->signUp($name, $cert_id, $mobile, $card_no);
        return $r;
    }

    /**
     * 富友 2. 法人开户注册
     * @throws
     */
    public function actionFuiouCorporationSignUp($company_name, $corporation_name, $cert_id, $mobile, $card_no)
    {
        $plat = new Fuiou();
        $r = $plat->corporationSignUp($company_name, $corporation_name, $cert_id, $mobile, $card_no);
        return $r;
    }

    /**
     * 富友 36. 用户信息查询接口
     * @throws
     */
    public function actionFuiouInquireUserInfo($user_ids)
    {
        $plat = new Fuiou();
        $r = $plat->inquireUserInfo($user_ids);
        return $r;
    }

    /**
     * 富友 37. 用户信息查询接口（目前只支持个人用户）
     * @throws
     */
    public function actionFuiouInquireUserInfoV2($user_ids = null, $user_idNos = null, $user_bankCards = null)
    {
        $plat = new Fuiou();
        $r = $plat->inquireUserInfoV2($user_ids, $user_idNos, $user_bankCards);
        return $r;
    }
}